#ifndef CONFIGUREDELEMENT_H
#define CONFIGUREDELEMENT_H

#include <QString>
#include <QDir>
#include <QFile>
#include <QtXml/qdom.h>

#include "appsettings.h"
#include "circuitelement.h"
#include "exceptions.h"

// Элементы, имеющие файл конфигурации
class ConfiguredElement : public CircuitElement
{
    Q_OBJECT

private:
    // загрузить элемент из файла
    void load(QFile& file);
    // сохранить элемент в файл
    void save(QFile& file);

protected:
    explicit ConfiguredElement();
    virtual ~ConfiguredElement();

    // Файл конфигурации
    QString config;

    //Получить полный путь к файлу конфигурации
    QString getFullPath(QString config);

    //Инициализирует специфичные свойства элемента из файла конфига
    virtual void initProps(const QDomNode& additionals);

    //Сохранить нужные свойства в конфиг
    virtual void saveProps(QDomNode& additionals);

public:

    /*
     * Инициализация
     * Сначала создаётся базовый объект,
     * и из конструктора нельзя вызывать виртуальные методы.
     * Поэтому используем явный вызов загрузки конфигурации
     */
    virtual void init(const QString& configPath);

    virtual void saveConfiguration(QString& filename);
    QString getConfig();
};

#endif // CONFIGUREDELEMENT_H
